package com.bldby.baselibrary.core.location;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.bldby.baselibrary.app.GlobalUtil;
import com.bldby.baselibrary.core.log.LogUtil;


/**
 * package name: com.bldby.baselibrary.core.location
 * user: yangqinbo
 * date: 2020/7/8
 * time: 10:00
 * email: 694125155@qq.com
 */
public class LocationUtil {
    private static LocationUtil locationUtil;
    private static GeocodeSearch geocoderSearch;
    //声明mlocationClient对象
    public AMapLocationClient locationClient;
    //声明mLocationOption对象
    public AMapLocationClientOption locationOption = null;
    public double latitude;
    public double longitude;
    public AMapLocation mapLocation;
    private GeocodeSearch.OnGeocodeSearchListener var1;

    public static LocationUtil getInstance() {
        if (locationUtil == null) {
            geocoderSearch = new GeocodeSearch(GlobalUtil.getApplication());
            locationUtil = new LocationUtil();
        }
        return locationUtil;
    }

    public void initLocation() {
        //初始化client
        locationClient = new AMapLocationClient(GlobalUtil.getApplication());
        //设置定位参数
        locationClient.setLocationOption(getDefaultOption());
        // 设置定位监听
        locationClient.setLocationListener(locationListener);
        geocoderSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
                if (var1!=null){
                    var1.onRegeocodeSearched(regeocodeResult,i);
                }
            }

            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
                if (var1!=null){
                    var1.onGeocodeSearched(geocodeResult,i);
                }
            }
        });
    }

    public GeocodeSearch.OnGeocodeSearchListener getVar1() {
        return var1;
    }

    public void setVar1(GeocodeSearch.OnGeocodeSearchListener var1) {
        this.var1 = var1;
    }

    /**
     * 默认的定位参数
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选，设置定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选，设置是否gps优先，只有在高精度模式下的单次定位有效，其他方式无效。默认关闭
        mOption.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(60000);//可选，设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选，设置是否返回逆地理地址信息。默认是true

        mOption.setOnceLocation(false);//可选，设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选，设置是否等待wifi刷新，默认为false.如果设置为true,会自动变为单次定位，持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选， 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选，设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选，设置是否开启wifi扫描。默认为true，如果设置为false会同时停止主动刷新，停止以后完全依赖于系统刷新，定位位置可能存在误差
        mOption.setLocationCacheEnable(true); //可选，设置是否使用缓存定位，默认为true
        return mOption;
    }

    /**
     * 开始定位
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    public void startLocation() {
        //根据控件的选择，重新设置定位参数
        //resetOption();
        // 设置定位参数
        //locationClient.setLocationOption(locationOption);
        // 启动定位
        initLocation();
        locationClient.startLocation();
    }

    // 根据控件的选择，重新设置定位参数
    public void resetOption() {
        // 设置是否需要显示地址信息
        locationOption.setNeedAddress(true);
        /**
         * 设置是否优先返回GPS定位结果，如果30秒内GPS没有返回定位结果则进行网络定位
         * 注意：只有在高精度模式下的单次定位有效，其他方式无效
         */
        locationOption.setGpsFirst(true);
        // 设置是否开启缓存
        locationOption.setLocationCacheEnable(true);
        // 设置是否单次定位
        locationOption.setOnceLocation(true);
        //设置是否等待设备wifi刷新，如果设置为true,会自动变为单次定位，持续定位时不要使用
        locationOption.setOnceLocationLatest(true);
        //设置是否使用传感器
        locationOption.setSensorEnable(true);
        locationOption.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        locationOption.setInterval(2000);//可选，设置定位间隔。默认为2秒
    }


    /**
     * 定位监听
     */
    AMapLocationListener locationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation loc) {
            if (null != loc) {
                //解析定位结果
                String result = LocationStrUtil.getLocationStr(loc);
                if (loc.getErrorCode() == 0) {
                    mapLocation = loc;
                    latitude = loc.getLatitude();
                    longitude = loc.getLongitude();
                }
                LogUtil.w("location", result);
            } else {
                LogUtil.e("location", "定位失败，loc is null");
            }
        }
    };


    /*
     * 获取定位数据
     * */
    public AMapLocation getLocation() {
//        if (mapLocation == null) {
//            mapLocation = new AMapLocation("");
//            mapLocation.setLatitude(0);
//            mapLocation.setLongitude(0);
//        }
        return mapLocation;
    }

    public void onSetLocation(GeocodeQuery query) {
        geocoderSearch.getFromLocationNameAsyn(query);
    }

    /**
     * 停止定位
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    private void stopLocation() {
        // 停止定位
        locationClient.stopLocation();
    }

    /**
     * 销毁定位
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    private void destroyLocation() {
        if (null != locationClient) {
            /**
             * 如果AMapLocationClient是在当前Activity实例化的，
             * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
             */
            locationClient.onDestroy();
            locationClient = null;
            locationOption = null;
        }
    }
}
